home *** CD-ROM | disk | FTP | other *** search
/ Dynamic HTML Construction Kit / Dynamic HTML Construction Kit.iso / earthlink / nscomm / java40.jar / java / text / RuleBasedCollator.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-11-03  |  7.5 KB  |  568 lines

  1. package java.text;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class RuleBasedCollator extends Collator {
  6.    static int CHARINDEX = 1879048192;
  7.    static int EXPANDCHARINDEX = 2113929216;
  8.    static int CONTRACTCHARINDEX = 2130706432;
  9.    static int UNMAPPED = -1;
  10.    private static final int SHORT_MAX_VALUE = 32767;
  11.    private static final int PRIMARYORDERINCREMENT = 65536;
  12.    private static final int MAXIGNORABLE = 65536;
  13.    private static final int SECONDARYORDERINCREMENT = 256;
  14.    private static final int TERTIARYORDERINCREMENT = 1;
  15.    static final int PRIMARYORDERMASK = -65536;
  16.    static final int SECONDARYORDERMASK = 65280;
  17.    static final int TERTIARYORDERMASK = 255;
  18.    private static final int SECONDARYRESETMASK = 65535;
  19.    private static final int IGNORABLEMASK = 65535;
  20.    private static final int PRIMARYDIFFERENCEONLY = -65536;
  21.    private static final int SECONDARYDIFFERENCEONLY = -256;
  22.    private static final int INITIALTABLESIZE = 20;
  23.    private static final int MAXKEYSIZE = 5;
  24.    static int PRIMARYORDERSHIFT = 16;
  25.    static int SECONDARYORDERSHIFT = 8;
  26.    private static final int MAXTOKENLEN = 256;
  27.    private static final int MAXRULELEN = 512;
  28.    private static final int COLLATIONKEYOFFSET = 1;
  29.    private boolean isFrenchSec = false;
  30.    private String ruleTable;
  31.    private CompactIntArray mapping;
  32.    private Vector contractTable;
  33.    private Vector expandTable;
  34.    private transient MergeCollation mPattern;
  35.    private transient boolean isOverIgnore = false;
  36.    private transient int currentOrder;
  37.    private transient short maxSecOrder;
  38.    private transient short maxTerOrder;
  39.    private transient char lastChar;
  40.    private transient StringBuffer key = new StringBuffer(5);
  41.    private transient int strengthResult = 3;
  42.    private transient StringBuffer primResult = new StringBuffer(256);
  43.    private transient StringBuffer secResult = new StringBuffer(256);
  44.    private transient StringBuffer terResult = new StringBuffer(256);
  45.  
  46.    public RuleBasedCollator(String var1) throws ParseException {
  47.       ((Collator)this).setStrength(2);
  48.       this.build(var1);
  49.    }
  50.  
  51.    public String getRules() {
  52.       if (this.ruleTable == null) {
  53.          this.ruleTable = this.mPattern.getPattern();
  54.          this.mPattern = null;
  55.       }
  56.  
  57.       return this.ruleTable;
  58.    }
  59.  
  60.    public CollationElementIterator getCollationElementIterator(String var1) {
  61.       return new CollationElementIterator(var1, this);
  62.    }
  63.  
  64.    public int compare(String var1, String var2) {
  65.       int var3 = 0;
  66.       CollationElementIterator var4 = new CollationElementIterator(var2, this);
  67.       CollationElementIterator var5 = new CollationElementIterator(var1, this);
  68.       int var6 = 0;
  69.       int var7 = 0;
  70.       boolean var8 = true;
  71.       boolean var9 = true;
  72.       boolean var10 = true;
  73.       boolean var11 = true;
  74.  
  75.       while(true) {
  76.          if (var8) {
  77.             var6 = var5.next();
  78.          } else {
  79.             var8 = true;
  80.          }
  81.  
  82.          if (var9) {
  83.             var7 = var4.next();
  84.          } else {
  85.             var9 = true;
  86.          }
  87.  
  88.          if (var6 == -1 || var7 == -1) {
  89.             break;
  90.          }
  91.  
  92.          if (var10) {
  93.             var6 = this.strengthOrder(var6);
  94.          }
  95.  
  96.          if (var11) {
  97.             var7 = this.strengthOrder(var7);
  98.          }
  99.  
  100.          var10 = true;
  101.          var11 = true;
  102.          if (var6 == 2147418112) {
  103.             var10 = false;
  104.          }
  105.  
  106.          if (var7 == 2147418112) {
  107.             var11 = false;
  108.          }
  109.  
  110.          if (var6 != var7) {
  111.             if (CollationElementIterator.primaryOrder(var6) == CollationElementIterator.primaryOrder(var7)) {
  112.                var3 = this.checkSecTerDiff(var6, var7, var3);
  113.             } else if (var6 == 0) {
  114.                var9 = false;
  115.             } else if (var7 == 0) {
  116.                var8 = false;
  117.             } else if (var6 < 65536) {
  118.                if (var7 < 65536) {
  119.                   var3 = this.checkSecTerDiff(var6, var7, var3);
  120.                } else {
  121.                   if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
  122.                      this.strengthResult = 1;
  123.                      var3 = 1;
  124.                   }
  125.  
  126.                   var9 = false;
  127.                }
  128.             } else {
  129.                if (var7 >= 65536) {
  130.                   if (CollationElementIterator.primaryOrder(var6) < CollationElementIterator.primaryOrder(var7)) {
  131.                      var3 = -1;
  132.                   } else {
  133.                      var3 = 1;
  134.                   }
  135.                   break;
  136.                }
  137.  
  138.                if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
  139.                   var3 = -1;
  140.                   this.strengthResult = 1;
  141.                }
  142.  
  143.                var8 = false;
  144.             }
  145.          }
  146.       }
  147.  
  148.       if (var6 != -1 && var7 == -1) {
  149.          if (this.isIgnorable(var6) && !this.isFrenchSec) {
  150.             return var3;
  151.          }
  152.  
  153.          if (this.strengthOrder(var6) != 0) {
  154.             var3 = 1;
  155.          }
  156.       }
  157.  
  158.       if (var7 != -1 && var6 == -1) {
  159.          if (this.isIgnorable(var7) && !this.isFrenchSec) {
  160.             return var3;
  161.          }
  162.  
  163.          if (this.strengthOrder(var7) != 0) {
  164.             var3 = -1;
  165.          }
  166.       }
  167.  
  168.       return var3;
  169.    }
  170.  
  171.    public CollationKey getCollationKey(String var1) {
  172.       if (var1 == null) {
  173.          return null;
  174.       } else {
  175.          this.primResult.setLength(0);
  176.          this.secResult.setLength(0);
  177.          this.terResult.setLength(0);
  178.          int var2 = 0;
  179.          boolean var3 = ((Collator)this).getStrength() >= 1;
  180.          boolean var4 = ((Collator)this).getStrength() >= 2;
  181.          short var5 = -1;
  182.          short var6 = -1;
  183.          CollationElementIterator var7 = new CollationElementIterator(var1, this);
  184.  
  185.          while((var2 = var7.next()) != -1) {
  186.             var5 = CollationElementIterator.secondaryOrder(var2);
  187.             var6 = CollationElementIterator.tertiaryOrder(var2);
  188.             if (!this.isIgnorable(var2)) {
  189.                this.primResult.append((char)(CollationElementIterator.primaryOrder(var2) + 1));
  190.                if (var3) {
  191.                   this.secResult.append((char)(var5 + 1));
  192.                }
  193.  
  194.                if (var4) {
  195.                   this.terResult.append((char)(var6 + 1));
  196.                }
  197.             } else {
  198.                if (var3) {
  199.                   this.secResult.append((char)(var5 + this.maxSecOrder + 1));
  200.                }
  201.  
  202.                if (var4) {
  203.                   this.terResult.append((char)(var6 + this.maxTerOrder + 1));
  204.                }
  205.             }
  206.          }
  207.  
  208.          if (this.isFrenchSec) {
  209.             this.reverse(this.secResult);
  210.             this.reverse(this.terResult);
  211.          }
  212.  
  213.          this.primResult.append('\u0000');
  214.          this.secResult.append('\u0000');
  215.          this.secResult.append(this.terResult.toString());
  216.          this.primResult.append(this.secResult.toString());
  217.          return new CollationKey(var1, this.primResult.toString());
  218.       }
  219.    }
  220.  
  221.    public Object clone() {
  222.       RuleBasedCollator var1 = (RuleBasedCollator)super.clone();
  223.       var1.primResult = new StringBuffer(256);
  224.       var1.secResult = new StringBuffer(256);
  225.       var1.terResult = new StringBuffer(256);
  226.       var1.key = new StringBuffer(5);
  227.       return var1;
  228.    }
  229.  
  230.    public boolean equals(Object var1) {
  231.       if (!super.equals(var1)) {
  232.          return false;
  233.       } else {
  234.          RuleBasedCollator var2 = (RuleBasedCollator)var1;
  235.          return this.getRules().equals(var2.getRules());
  236.       }
  237.    }
  238.  
  239.    public int hashCode() {
  240.       return this.getRules().hashCode();
  241.    }
  242.  
  243.    private void build(String var1) throws ParseException {
  244.       this.mapping = new CompactIntArray(UNMAPPED);
  245.       boolean var2 = false;
  246.       if (var1.length() == 0) {
  247.          throw new ParseException("Build rules empty.", 0);
  248.       } else {
  249.          var1 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition());
  250.          this.mPattern = new MergeCollation(var1);
  251.  
  252.          for(int var8 = 0; var8 < this.mPattern.getCount(); ++var8) {
  253.             PatternEntry var5 = this.mPattern.getItemAt(var8);
  254.             if (var5 != null) {
  255.                String var4 = var5.getChars();
  256.                if (var4.length() > 1 && var4.charAt(var4.length() - 1) == '@') {
  257.                   this.isFrenchSec = true;
  258.                   var4 = var4.substring(0, var4.length() - 1);
  259.                }
  260.  
  261.                String var3 = var5.getExtension();
  262.                if (var3.length() != 0) {
  263.                   this.addExpandOrder(var4, var3, var5.getStrength());
  264.                } else if (var4.length() > 1) {
  265.                   this.addContractOrder(var4, var5.getStrength());
  266.                   this.lastChar = var4.charAt(0);
  267.                } else {
  268.                   char var6 = var4.charAt(0);
  269.                   this.addOrder(var6, var5.getStrength());
  270.                   this.lastChar = var6;
  271.                }
  272.             }
  273.          }
  274.  
  275.          this.commit();
  276.          this.mapping.compact();
  277.       }
  278.    }
  279.  
  280.    private final void commit() {
  281.       if (this.expandTable != null) {
  282.          for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
  283.             int[] var2 = (int[])this.expandTable.elementAt(var1);
  284.  
  285.             for(int var3 = 0; var3 < var2.length; ++var3) {
  286.                if (var2[var3] < EXPANDCHARINDEX && var2[var3] > CHARINDEX) {
  287.                   char var4 = (char)(var2[var3] - CHARINDEX);
  288.                   int var5 = this.mapping.elementAt(var4);
  289.                   if (var5 == UNMAPPED) {
  290.                      var2[var3] = '\uffff' & var2[var3 - 1];
  291.                   } else if (var5 >= CONTRACTCHARINDEX) {
  292.                      Object var6 = null;
  293.                      Vector var7 = (Vector)this.contractTable.elementAt(var5 - CONTRACTCHARINDEX);
  294.                      EntryPair var8 = (EntryPair)var7.lastElement();
  295.                      var2[var3] = var8.value;
  296.                   } else {
  297.                      var2[var3] = var5;
  298.                   }
  299.                }
  300.             }
  301.          }
  302.       }
  303.  
  304.    }
  305.  
  306.    private final boolean isSpecialChar(char var1) {
  307.       return var1 == '/' || var1 == ',' || var1 == ';' || var1 == '<' || var1 == '@' || var1 == '=';
  308.    }
  309.  
  310.    private final int increment(int var1, int var2) {
  311.       switch (var1) {
  312.          case 0:
  313.             var2 += 65536;
  314.             var2 &= -65536;
  315.             break;
  316.          case 1:
  317.             var2 += 256;
  318.             var2 &= -256;
  319.             if (this.isOverIgnore) {
  320.                ++this.maxSecOrder;
  321.             }
  322.             break;
  323.          case 2:
  324.             ++var2;
  325.             if (this.isOverIgnore) {
  326.                ++this.maxTerOrder;
  327.             }
  328.       }
  329.  
  330.       return var2;
  331.    }
  332.  
  333.    private final void addOrder(char var1, int var2) {
  334.       int var3 = this.mapping.elementAt(var1);
  335.       if (var3 == UNMAPPED) {
  336.          this.currentOrder = this.increment(var2, this.currentOrder);
  337.          this.mapping.setElementAt(var1, this.currentOrder);
  338.       } else if (var3 < 0) {
  339.          int var4 = var3 & '\uffff';
  340.          int var5 = CONTRACTCHARINDEX + var4;
  341.          this.key.setLength(0);
  342.          this.key.append(var1);
  343.          Vector var6 = this.getContractValues(var4);
  344.          EntryPair var7 = new EntryPair();
  345.          var7.entryName = this.key.toString();
  346.          this.currentOrder = this.increment(var2, this.currentOrder);
  347.          var7.value = this.currentOrder;
  348.          this.mapping.setElementAt(var1, var5);
  349.          var6.insertElementAt(var7, 0);
  350.       } else {
  351.          if (var3 > CONTRACTCHARINDEX) {
  352.             this.key.setLength(0);
  353.             this.key.append(var1);
  354.             this.addContractOrder(this.key.toString(), var2);
  355.          }
  356.  
  357.       }
  358.    }
  359.  
  360.    private final void addContractOrder(String var1, int var2) {
  361.       if (this.contractTable == null) {
  362.          this.contractTable = new Vector(20);
  363.       }
  364.  
  365.       this.key.setLength(0);
  366.       this.key.append(var1.charAt(0));
  367.       int var3 = UNMAPPED;
  368.       Vector var4 = null;
  369.       EntryPair var5 = new EntryPair();
  370.  
  371.       for(int var6 = 0; var6 < this.contractTable.size(); ++var6) {
  372.          var4 = (Vector)this.contractTable.elementAt(var6);
  373.          if ((var3 = this.getEntry(var4, this.key.toString())) != UNMAPPED) {
  374.             break;
  375.          }
  376.       }
  377.  
  378.       int var7 = 0;
  379.       if (var2 != 3) {
  380.          var7 = this.increment(var2, this.currentOrder);
  381.       } else {
  382.          var7 = this.mapping.elementAt(var1.charAt(0));
  383.          if (var7 == UNMAPPED) {
  384.             this.currentOrder = this.mapping.elementAt(this.lastChar);
  385.             var7 = this.increment(var2, this.currentOrder);
  386.          }
  387.       }
  388.  
  389.       if (var3 != UNMAPPED) {
  390.          var5.entryName = var1;
  391.          var5.value = var7;
  392.          var4.insertElementAt(var5, 0);
  393.       } else {
  394.          Vector var8 = new Vector(20);
  395.          int var9 = CONTRACTCHARINDEX + this.contractTable.size();
  396.          int var10 = this.mapping.elementAt(var1.charAt(0));
  397.          if (var10 == UNMAPPED) {
  398.             Object var12 = null;
  399.             this.mapping.setElementAt(var1.charAt(0), -65536 + this.contractTable.size());
  400.          } else {
  401.             var5.entryName = this.key.toString();
  402.             this.mapping.setElementAt(var1.charAt(0), var9);
  403.             var5.value = var10;
  404.             var8.insertElementAt(var5, 0);
  405.          }
  406.  
  407.          EntryPair var11 = new EntryPair();
  408.          var11.entryName = var1;
  409.          var11.value = var7;
  410.          var8.insertElementAt(var11, 0);
  411.          this.contractTable.insertElementAt(var8, this.contractTable.size());
  412.       }
  413.  
  414.       if (var2 != 3) {
  415.          this.currentOrder = var7;
  416.       }
  417.  
  418.    }
  419.  
  420.    private final int getEntry(Vector var1, String var2) {
  421.       for(int var3 = 0; var3 < var1.size(); ++var3) {
  422.          EntryPair var4 = (EntryPair)var1.elementAt(var3);
  423.          if (var4.entryName.equals(var2)) {
  424.             return var3;
  425.          }
  426.       }
  427.  
  428.       return UNMAPPED;
  429.    }
  430.  
  431.    Vector getContractValues(char var1) {
  432.       int var2 = this.mapping.elementAt(var1);
  433.       return this.getContractValues(var2 - CONTRACTCHARINDEX);
  434.    }
  435.  
  436.    Vector getContractValues(int var1) {
  437.       return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
  438.    }
  439.  
  440.    private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
  441.       EntryPair var4 = new EntryPair();
  442.       if (this.expandTable == null) {
  443.          this.expandTable = new Vector(20);
  444.       }
  445.  
  446.       int[] var5 = new int[var2.length() + 1];
  447.       int var6 = EXPANDCHARINDEX + this.expandTable.size();
  448.       this.key.setLength(0);
  449.       int var7 = UNMAPPED;
  450.       if (var1.length() > 1) {
  451.          this.addContractOrder(var1, var3);
  452.          this.lastChar = var1.charAt(0);
  453.          Vector var8 = this.getContractValues(var1.charAt(0));
  454.          int var9 = UNMAPPED;
  455.          var9 = this.getEntry(var8, var1);
  456.          if (var9 != UNMAPPED) {
  457.             var4 = (EntryPair)var8.elementAt(var9);
  458.             var7 = var4.value;
  459.          }
  460.  
  461.          var4.entryName = var1;
  462.          var4.value = var6;
  463.       } else {
  464.          char var14 = var1.charAt(0);
  465.          if (this.mapping.elementAt(var14) == UNMAPPED) {
  466.             this.addOrder(var14, var3);
  467.             this.lastChar = var14;
  468.          }
  469.  
  470.          var7 = this.mapping.elementAt(this.lastChar);
  471.          this.mapping.setElementAt(this.lastChar, var6);
  472.       }
  473.  
  474.       var5[0] = var7;
  475.  
  476.       for(int var15 = 0; var15 < var2.length(); ++var15) {
  477.          int var17 = this.mapping.elementAt(var2.charAt(var15));
  478.          if (var17 >= CONTRACTCHARINDEX) {
  479.             this.key.append(var2.charAt(var15));
  480.             int var10 = CHARINDEX + var2.charAt(var15);
  481.             Vector var11 = this.getContractValues(var2.charAt(var15));
  482.             if (var11 != null) {
  483.                int var12 = UNMAPPED;
  484.                var12 = this.getEntry(var11, this.key.toString());
  485.                if (var12 != UNMAPPED) {
  486.                   var4 = (EntryPair)var11.elementAt(var12);
  487.                   var10 = var4.value;
  488.                }
  489.             }
  490.  
  491.             this.key.setLength(0);
  492.             var5[var15 + 1] = var10;
  493.          } else if (var17 != UNMAPPED) {
  494.             var5[var15 + 1] = var17;
  495.          } else {
  496.             var5[var15 + 1] = CHARINDEX + var2.charAt(var15);
  497.          }
  498.       }
  499.  
  500.       this.expandTable.insertElementAt(var5, this.expandTable.size());
  501.    }
  502.  
  503.    final int[] getExpandValueList(char var1) {
  504.       int var2 = this.mapping.elementAt(var1);
  505.       if (var2 >= EXPANDCHARINDEX && var2 < CONTRACTCHARINDEX) {
  506.          int var3 = var2 - EXPANDCHARINDEX;
  507.          return (int[])this.expandTable.elementAt(var3);
  508.       } else {
  509.          return null;
  510.       }
  511.    }
  512.  
  513.    final int[] getExpandValueList(int var1) {
  514.       return var1 < this.expandTable.size() ? (int[])this.expandTable.elementAt(var1) : null;
  515.    }
  516.  
  517.    private final int strengthOrder(int var1) {
  518.       if (((Collator)this).getStrength() == 0) {
  519.          var1 &= -65536;
  520.       } else if (((Collator)this).getStrength() == 1) {
  521.          var1 &= -256;
  522.       }
  523.  
  524.       return var1;
  525.    }
  526.  
  527.    final boolean isIgnorable(int var1) {
  528.       return CollationElementIterator.primaryOrder(var1) == 0;
  529.    }
  530.  
  531.    final int getUnicodeOrder(char var1) {
  532.       return this.mapping.elementAt(var1);
  533.    }
  534.  
  535.    private final int checkSecTerDiff(int var1, int var2, int var3) {
  536.       int var4 = var3;
  537.       if (CollationElementIterator.secondaryOrder(var1) != CollationElementIterator.secondaryOrder(var2)) {
  538.          if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
  539.             this.strengthResult = 1;
  540.             if (CollationElementIterator.secondaryOrder(var1) < CollationElementIterator.secondaryOrder(var2)) {
  541.                var4 = -1;
  542.             } else {
  543.                var4 = 1;
  544.             }
  545.          }
  546.       } else if (CollationElementIterator.tertiaryOrder(var1) != CollationElementIterator.tertiaryOrder(var2) && (var3 == 0 || this.isFrenchSec)) {
  547.          this.strengthResult = 2;
  548.          if (CollationElementIterator.tertiaryOrder(var1) < CollationElementIterator.tertiaryOrder(var2)) {
  549.             var4 = -1;
  550.          } else {
  551.             var4 = 1;
  552.          }
  553.       }
  554.  
  555.       return var4;
  556.    }
  557.  
  558.    private final void reverse(StringBuffer var1) {
  559.       String var2 = var1.toString();
  560.       var1.setLength(0);
  561.  
  562.       for(int var3 = var2.length() - 1; var3 >= 0; --var3) {
  563.          var1.append(var2.charAt(var3));
  564.       }
  565.  
  566.    }
  567. }
  568.